#!/bin/bash

#
# Defino la expresion regular para digitos
#
DIGITO_REGEX="[0-9]+|^$"

#
#
#
GRUPODIR_REGEX="(.*/grupo[0-9][0-9])(/.*)"

#
# Defino la variable para respuesta del usuario
#
ANSWER=""

#
# Funcion que chequea el directorio grupo y define la variable de ambiente
#
function chequear_grupo()
{
	local CURRENTDIR=`pwd`
	if [[ $CURRENTDIR =~ $GRUPODIR_REGEX ]]
	then
        	grupo="${BASH_REMATCH[1]}"
		return 0
	else
	        return 1;
	fi;
}

#
#
#
function chequear_condiciones()
{
	echo "**************************************************************"
	echo "* Proceso de Instalacion del sistema Postulantes             *"
	echo "*          Copyright TPSistemasOp (c)2011                    *"
	echo "**************************************************************"
	echo "* Al instalar POSTULA UD. expresa estar en un todo de acuerdo*"
	echo "* con los terminos y condiciones del  ACUERDO DE LICENCIA DE *"
	echo "* SOFTWARE incluido en este paquete.                         *"
	echo "**************************************************************"

	echo ""
	echo "Acepta la licencia y terminos de condiciones? (S/N)"
	read ANSWER

	if [ "$ANSWER" = "S" -o "$ANSWER" = "s" ]
	then
		. gralog.sh "INSTULA" "El usuario acepto terminos de condiciones" "I"
		return  0;
	else
		. gralog.sh "INSTULA" "El usuario no acepto terminos de condiciones" "F"
		return 1;
	fi;
}

#
# Funcion que chequea si perl version 5 esta instalado
#
function chequear_perl()
{
	. gralog.sh "INSTULA" "Verificando version de Perl instalada..." "W"
	PERLVER=`perl -v | grep "This is perl, v" | sed "s/.*v\([0-9]\).*/\1/"`
	if [ $PERLVER -lt 5 ];
	then
		echo "Para instalar POSTULA es necesario contar previamente con Perl 5 o superior."
		echo "Efectue su instalacion e intentelo nuevamente."
		echo "Proceso de instalacion cancelado."
		. gralog.sh "INSTULA" "Para instalar POSTULA es necesario contar previamente con Perl 5 o superior estando instalado." "I"
		. gralog.sh "INSTULA" "Efectue su instalacion e intentelo nuevamente." "I"
		. gralog.sh "INSTULA" "Proceso de instalacion cancelado." "E"
		return 1
	else
		echo "Perl v$PERLVER instalado."
		echo ""
		echo ""
		. gralog.sh "INSTULA" "Perl v$PERLVER instalado." "I"
		return 0
	fi
}

#
# Funcion que chequea los componentes instalados
#
function chequear_componentes_instalados()
{
	COMPONENTES_INSTALADOS=0
	COMPARAR_FECHAS_INSTALADO=`find "$grupo" \( -name "comparar_fechas.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -f "$COMPARAR_FECHAS_INSTALADO" ]
	then
		echo "Componente COMPARAR_FECHAS instalado en: $COMPARAR_FECHAS_INSTALADO"
		. gralog.sh "INSTULA" "Componente COMPARAR_FECHAS instalado en: $COMPARAR_FECHAS_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	GRALOG_INSTALADO=`find "$grupo" \( -name "gralog.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$GRALOG_INSTALADO" ]
	then
		echo "Componente GRALOG instalado en: $GRALOG_INSTALADO"
		. gralog.sh "INSTULA" "Componente GRALOG instalado en: $GRALOG_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	MOVER_INSTALADO=`find "$grupo" \( -name "mover.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$MOVER_INSTALADO" ]
	then
		echo "Componente MOVER instalado en: $MOVER_INSTALADO"
		. gralog.sh "INSTULA" "Componente MOVER instalado en: $MOVER_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	PLIST_INSTALADO=`find "$grupo" \( -name "plist.pl" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$PLIST_INSTALADO" ]
	then
		echo "Componente PLIST instalado en: $PLIST_INSTALADO"
		. gralog.sh "INSTULA" "Componente PLIST instalado en: $PLIST_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	POSTINI_INSTALADO=`find "$grupo" \( -name "postini.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$POSTINI_INSTALADO" ]
	then
		echo "Componente POSTINI instalado en: $POSTINI_INSTALADO"
		. gralog.sh "INSTULA" "Componente POSTINI instalado en: $POSTINI_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	POSTONIO_INSTALADO=`find "$grupo" \( -name "postonio.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$POSTINI_INSTALADO" ]
	then
		echo "Componente POSTONIO instalado en: $POSTONIO_INSTALADO"
		. gralog.sh "INSTULA" "Componente POSTONIO instalado en: $POSTONIO_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	POSTULAR_INSTALADO=`find "$grupo" \( -name "postular.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$POSTULAR_INSTALADO" ]
	then
		echo "Componente POSTULAR instalado en: $POSTULAR_INSTALADO"
		. gralog.sh "INSTULA" "Componente POSTULAR instalado en: $POSTULAR_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	START_INSTALADO=`find "$grupo" \( -name "start.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$START_INSTALADO" ]
	then
		echo "Componente START instalado en: $START_INSTALADO"
		. gralog.sh "INSTULA" "Componente START instalado en: $START_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	STOP_INSTALADO=`find "$grupo" \( -name "stop.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$STOP_INSTALADO" ]
	then
		echo "Componente STOP instalado en: $STOP_INSTALADO"
		. gralog.sh "INSTULA" "Componente STOP instalado en: $STOP_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	SUBROUTINES_INSTALADO=`find "$grupo" \( -name "subroutines.pm" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$SUBROUTINES_INSTALADO" ]
	then
		echo "Componente SUBROUTINES instalado en: $SUBROUTINES_INSTALADO"
		. gralog.sh "INSTULA" "Componente SUBROUTINES instalado en: $SUBROUTINES_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	VALIDAR_FECHA_INSTALADO=`find "$grupo" \( -name "validar_fecha.sh" \) -and \( -not -regex ".*/inst/.*" \)`
	if [ -n "$VALIDAR_FECHA_INSTALADO" ]
	then
		echo "Componente VALIDAR_FECHA instalado en: $VALIDAR_FECHA_INSTALADO"
		. gralog.sh "INSTULA" "Componente VALIDAR_FECHA instalado en: $VALIDAR_FECHA_INSTALADO" "I"
		COMPONENTES_INSTALADOS=1
	fi;

	return $COMPONENTES_INSTALADOS;
}

#
# Funcion que pide el ingreso de directorios al usuario y los valida
#
function pedir_chequear_directorios()
{
	#
	# Pide el ingreso del directorio binario
	#

	echo "Ingrese el directorio de instalacion de los binarios: (\"$INSTBINDIR\")";
	read ANSWER;

	if [ -n "$ANSWER" ]
	then
        	INSTBINDIR=$ANSWER;
	fi;

	. gralog.sh "INSTULA" "Se ha seleccionado el directorio de binarios: $INSTBINDIR" "I"

	#
	# Pide el ingreso del directorio de arribos
	#
	echo "Ingrese el directorio de arribo (\"$INSTARRIDIR\")";
	read ANSWER;

	if [ -n "$ANSWER" ]
	then
		INSTARRIDIR=$ANSWER;
	fi;

	. gralog.sh "INSTULA" "Se ha seleccionado el directorio de arribos: $INSTARRIDIR" "I"

	NO_VALIDO=0
	while [ $NO_VALIDO -ne 1 ]
	do
		#
	        # Pide el ingreso del tamanio de datos
	        #
        	echo "Ingresar el espacio minimo requerido para datos externos (en MBytes): $INSTDATASIZE";
	        read ANSWER;
		if [[ $ANSWER =~ $DIGITO_REGEX ]]
		then
			#
			# Calculo espacio disponible en disco
			#
			ESPACIO_DISPONIBLE=`df | grep "/$" | awk -F ' ' '{ print $4}'`
			ESPACIO_DISPONIBLE=`echo "$ESPACIO_DISPONIBLE / 1024 / 1024" | bc`

			if [ -n "$ANSWER" ]
			then
				INSTDATASIZE=$ANSWER;
			fi;

			if [ "$INSTDATASIZE" -le "$ESPACIO_DISPONIBLE" ]
			then
				NO_VALIDO=1
			else
				echo "No hay espacio disponible en disco, solicitado $INSTDATASIZE, actual: $ESPACIO_DISPONIBLE"
				. gralog.sh "INSTULA" "Se encuentran solo $ESPACIO_DISPONIBLE Mb en disco, solicitados $INSTDATASIZE"
			fi;
		else
			echo "Debe ingresar un valor numerico"
		fi;
	done;

        #
        # Pide el ingreso del directorio de logs
        #
        echo "Ingrese el directorio de los logs: (\"$INSTLOGDIR\")";
        read ANSWER;

        if [ -n "$ANSWER" ]
        then
                INSTLOGDIR=$ANSWER;
        fi;

        . gralog.sh "INSTULA" "Se ha seleccionado el directorio de logs: $INSTLOGDIR" "I"

	#
	# Pide el ingreso de la extension de los
	#
	echo "Ingrese la extension de los logs: ($INSTLOGEXT)";
	read ANSWER;

	if [ -n "$ANSWER" ]
	then
		INSTLOGEXT=$ANSWER;
	fi;

	. gralog.sh "INSTULA" "Se ha seleccionado la extension de logs: $INSTLOGEXT" "I"

	#
	# Pide el ingreso del tamanio de archivos de logs
	#
	NO_VALIDO=0
	while [ $NO_VALIDO -ne 1 ]
	do
		echo "Ingrese tamanio de archivo de logs maximo (en Kbytes): $INSTLOGSIZE"
		read ANSWER;

                if [[ $ANSWER =~ $DIGITO_REGEX ]]
                then
			if [ -n "$ANSWER" ]
			then
				INSTLOGSIZE=$ANSWER;
			fi;
                        NO_VALIDO=1;
		else
			echo "Debe ingresar un valor numerico"
                fi;
	done;

	. gralog.sh "INSTULA" "Se ha seleccionado el tamanio maximo de archivos de log: $INSTLOGSIZE" "I"

	return 0;
}

function confirmar_instalacion()
{
	echo "Parametros de instalacion del paquete POSTULA"
	echo "............................................."
	echo "Directorio de trabajo: $grupo"
	echo "Directorio de instalacion: $grupo/inst"
	echo "Directorio de configuracion: $grupo/conf"
	echo "Directorio de datos: $grupo/data"
	echo "Directorio de ejecutables: $INSTBINDIR"
	echo "Directorio de arribos: $INSTARRIDIR"
	echo "Espacio minimo reservado en $INSTARRIDIR: $INSTDATASIZE Mb"
	echo "Directorio para archivos de log $INSTLOGDIR"
	echo "Extension para archivos de log $INSTLOGEXT"
	echo "Tamanio maximo para cada archivo de log $INSTLOGSIZE Kb"
	echo "Log de la instalacion $grupo/conf/INSTULA.log"
	echo ""
	echo ""
	echo "Si los datos ingresados son correctos oprima solo ENTER para iniciar la instalacion."
	echo "Si desea modificar alguno de ellos apriete cualquier tecla"
	echo "...................................................................................."
	read ANSWER

	if [ -z "$ANSWER" ]
	then
		return 0
	else
		return 1;
	fi;
}

#
# Funcion que instala los componentes de POSTULA
#
function instalar_componentes()
{
	#
	# Crea directorio de binarios si no existe
	#
	mkdir -p "$INSTBINDIR"

	#
	# Crea el directorio de arribos si no existe
	#
	mkdir -p "$INSTARRIDIR"

	#
	# Crea el directorio de logs si no existe
	#
	mkdir -p "$INSTLOGDIR"

	#
	# Crea el directorio de recibidos si no existe
	#
	mkdir -p "$grupo/recibidos"

	#
	# Crea el directorio de rechazados si no existe
	#
	mkdir -p "$grupo/rechazados"

	#
	# Crea el directorio de nuevos si no existe
	#
	mkdir -p "$grupo/nuevos"

	#
	# Crea el directorio de list si no existe
	#
	mkdir -p "$grupo/list"
	
	echo "Moviendo componente comparar_fechas.sh"
	. gralog.sh "INSTULA" "Moviendo componente comparar_fechas.sh" "I"
	cp "comparar_fechas.sh" "$INSTBINDIR/comparar_fechas.sh"

	echo "Moviendo componente gralog.sh"
	. gralog.sh "INSTULA" "Moviendo componente gralog.sh" "I"
	cp "gralog.sh" "$INSTBINDIR/gralog.sh"

	echo "Moviendo componente mover.sh"
	. gralog.sh "INSTULA" "Moviendo componente mover.sh" "I"
	cp "mover.sh" "$INSTBINDIR/mover.sh"

	echo "Moviendo componente plist.pl"
	. gralog.sh "INSTULA" "Moviendo componente plist.sh" "I"
	cp "plist.pl" "$INSTBINDIR/plist.pl"

	echo "Moviendo componente postini.sh"
	. gralog.sh "INSTULA" "Moviendo componente postini.sh" "I"
	cp "postini.sh" "$INSTBINDIR/postini.sh"

	echo "Moviendo componente postonio.sh"
	. gralog.sh "INSTULA" "Moviendo componente postonio.sh" "I"
	cp "postonio.sh" "$INSTBINDIR/postonio.sh"

	echo "Moviendo componente postular.sh"
	. gralog.sh "INSTULA" "Moviendo componente postular.sh" "I"
	cp "postular.sh" "$INSTBINDIR/postular.sh"

	echo "Moviendo componente start.sh"
	. gralog.sh "INSTULA" "Moviendo componente start.sh" "I"
	cp "start.sh" "$INSTBINDIR/start.sh"

	echo "Moviendo componente stop.sh"
	. gralog.sh "INSTULA" "Moviendo componente stop.sh" "I"
	cp "stop.sh" "$INSTBINDIR/stop.sh"

	echo "Moviendo componente subroutines.pm"
	. gralog.sh "INSTULA" "Moviendo componente subroutines.pm" "I"
	cp "subroutines.pm" "$INSTBINDIR/subroutines.pm"

	echo "Moviendo componente validar_fecha.sh"
	. gralog.sh "INSTULA" "Moviendo componente validar_fecha.sh" "I"
	cp "validar_fecha.sh" "$INSTBINDIR/validar_fecha.sh"

	FECHA_INSTALACION=`date "+%d/%m/%y"`
	USUARIO=`whoami`
	echo "......................................................."
	echo ". Se encuentran instalados los siguientes componentes ."
	echo ". COMPARAR_FECHAS $FECHA_INSTALACION $USUARIO         ."
	echo ". GRALOG          $FECHA_INSTALACION $USUARIO         ."
	echo ". MOVER           $FECHA_INSTALACION $USUARIO         ."
	echo ". PLIST           $FECHA_INSTALACION $USUARIO         ."
	echo ". POSTINI         $FECHA_INSTALACION $USUARIO         ."
	echo ". POSTONIO        $FECHA_INSTALACION $USUARIO         ."
	echo ". POSTULAR        $FECHA_INSTALACION $USUARIO         ."
	echo ". START           $FECHA_INSTALACION $USUARIO         ."
	echo ". STOP            $FECHA_INSTALACION $USUARIO         ."
	echo ". SUBROUTINES     $FECHA_INSTALACION $USUARIO         ."
	echo ". VALIDAR_FECHA   $FECHA_INSTALACION $USUARIO         ."
	echo "......................................................."
	echo ". Fin del proceso de instalacion de POSTULANTES       ."
	echo ".     Copyright TPSistemasOp (c)2011                  ."
	echo "......................................................."

	fin
}

#
# Funcion que guarda la configuracion de la instalacion
#
function guardar_configuracion()
{
	echo "CURRDIR = $grupo" > "$grupo/conf/instula.conf"
	echo "CONFDIR = $grupo/conf" >> "$grupo/conf/instula.conf"
	echo "BINDIR = $INSTBINDIR" >> "$grupo/conf/instula.conf"
	echo "ARRIDIR = $INSTARRIDIR" >> "$grupo/conf/instula.conf"
	echo "DATASIZE = $INSTDATASIZE" >> "$grupo/conf/instula.conf"
	echo "LOGDIR = $INSTLOGDIR" >> "$grupo/conf/instula.conf"
	echo "LOGEXT = $INSTLOGEXT" >> "$grupo/conf/instula.conf"
	echo "LOGSIZE = $INSTLOGSIZE" >> "$grupo/conf/instula.conf"
	echo "USERID = $USUARIO" >> "$grupo/conf/instula.conf"
	echo "FECINS = $FECHA_INSTALACION" >> "$grupo/conf/instula.conf"
}

#
# Funcion fin que termina la instalacion
#
function fin()
{
	. gralog.sh "INSTULA" "Se ha finalizado la instalacion"
	exit 0;
}

#
# Obtengo fecha de instalacion
#
FECHA_INSTALACION=`date "+%d/%m/%y"`

#
# Obtengo usuario actual
#
USUARIO=`whoami`
#
# Chequea el directorio de grupo
#
chequear_grupo

if [ $? -ne 0 ]
then
	echo "No se encuentra el directorio grupo03"
	exit 1;
fi;

#
# Defino la variable para directorio de log
#
LOGDIR="$grupo/conf"

#
# Defino la variable para extension de log
#
LOGEXT="log"

#
# Defino la variable para tamanio de log
#
LOGSIZE=102400

#
# Defino la variable para directorio de binarios
#
INSTBINDIR="$grupo/bin"

#
# Defino la variable para directorio de logs
#
INSTLOGDIR="$grupo/log"

#
# Defino la variable para extension de logs
#
INSTLOGEXT="log"

#
# Defino la variable para direcctorio de arribos
#
INSTARRIDIR="$grupo/arribos"

#
# Defino la variable para tamanio de datos
#
INSTDATASIZE=100

#
# Defino la variable para tamanio de logs
#
INSTLOGSIZE="400"

#
# Inicia la instalacion
#
. gralog.sh "INSTULA" "Inicio de la instalacion" "I"

#
# Chequea terminos de condiciones
#
chequear_condiciones

if [ $? -ne 0 ]
then
	. gralog.sh "INSTULA" "No se ha confirmado las condiciones y licencia" "I"
	fin
fi;

#
# Chequea la version de perl isntalada
#
chequear_perl

if [ $? -ne 0 ]
then
	. gralog.sh "INSTULA" "No se ha encontrado y verificado perl" "I"
	fin
fi;

chequear_componentes_instalados

if [ $? -ne 0 ]
then
	. gralog.sh "INSTULA" "Hay componentes instalados, cancelando la instalacion" "I"
	fin
fi;

echo "Todos los directorios del sistema de postulantes seran subdirectorios de \$grupo: $grupo"
echo "Todos los componentes de la instalacion se obtendran del repositorio: \$grupo/inst: $grupo/inst"
for componente in `ls $grupo/inst`
do
	echo "Componente: $componente"
done;
echo "El archivo de configuracion y el log de la instalacion se registraran en \$grupo/conf: $grupo/conf"

ACEPTAR_INSTALACION=0
while [ $ACEPTAR_INSTALACION -ne 1 ]
do
	#
	# Pide y chequea el ingreso de directorios
	#
	pedir_chequear_directorios

	#
	# Confirma la instalacion
	#
	confirmar_instalacion

	if [ $? -eq 0 ]
	then
		ACEPTAR_INSTALACION=1;
	fi;
done;

#
# Guarda la configuracion de la instalacion
#
guardar_configuracion

#
# Instala los componentes
#
instalar_componentes
